
short int KnightsOfRound (short int mainSudoku[9][9], short int mainMissing[27][10], short int WildCard)
{
	short int isValid=1, isComplete=0, linha,coluna,x=0,fator,z, sudoku[9][9],missing[27][10];
	short int didItWork;

	for (linha=0;linha<9;linha++)
	{
		for (coluna=0;coluna<9;coluna++)
		{
			sudoku[linha][coluna]=mainSudoku[linha][coluna];
		}
	}
	for (linha=0;linha<27;linha++)
	{
		for (coluna=0;coluna<10;coluna++)
		{
			missing[linha][coluna]=mainMissing[linha][coluna];
		}
	}

	while (isValid==1 && isComplete%2==0)
	{
		while (x==0)
		{
			x=1;
			for (fator=0;fator<9;fator++)
			{
				z = KnightOfTwo(sudoku,missing,fator);
				if (z!=0)
				{
					linha = z/1000;
					coluna = (z/100)%10;
					sudoku[linha][coluna]=(z/10)%10;
					//printf("KnightOfTwo(main): Inserção definitiva do valor %d na casa %dx%d feita com sucesso.\n",(z/10)%10,(linha+1),(coluna+1));
					x=0;
					missing[linha][9]--;
					missing[linha][((z/10)%10)-1]++;
					missing[coluna+9][9]--;
					missing[coluna+9][((z/10)%10)-1]++;
					missing[ddq(linha,coluna)+18][9]--;
					missing[ddq(linha,coluna)+18][((z/10)%10)-1]++;
					fator=-1;
				}	
			}
			// KNIGHT OF TWO ACIMA

			for (linha=0;linha<9;linha++)
			{
				for (coluna=0;coluna<9;coluna++)
				{
					z = KnightOfOne(sudoku,missing,linha,coluna);
					if (z!=0)
					{
						sudoku[linha][coluna]=z/10;
						x=0;
						//printf("KnightOfOne(main): Inserção definitiva do valor %d na casa %dx%d feita com sucesso.\n",z/10,(linha+1),(coluna+1));
						missing[linha][9]--;
						missing[linha][(z/10)-1]++;
						missing[coluna+9][9]--;
						missing[coluna+9][(z/10)-1]++;
						missing[ddq(linha,coluna)+18][9]--;
						missing[ddq(linha,coluna)+18][(z/10)-1]++;
						coluna=9;
						linha=0;
					}
					
				}
			}// KNIGHT OF ONE ACIMA
		}
		x=0;
		isValid = vGeral(sudoku,missing);
		isComplete = vComplete(sudoku);
		if (vComplete(sudoku)%2==0)
		{
			z = KnightOfZero(sudoku,missing,WildCard);
			if (z!=0)
			{
				linha = z/1000;
				coluna = (z/100)%10;
				sudoku[linha][coluna]=(z/10)%10;
				//printf("KnightOfZero(main): Inserção definitiva do valor %d na casa %dx%d feita com sucesso.\n",(z/10)%10,(linha+1),(coluna+1));
				missing[linha][9]--;
				missing[linha][((z/10)%10)-1]++;
				missing[coluna+9][9]--;
				missing[coluna+9][((z/10)%10)-1]++;
				missing[ddq(linha,coluna)+18][9]--;
				missing[ddq(linha,coluna)+18][((z/10)%10)-1]++;
			}
		}
		isValid = vGeral(sudoku,missing);
		isComplete = vComplete(sudoku);
	}
	
	if (isValid==1 && isComplete==11)
	{
		system("clear");
		//printf("<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n\n Solução encontrada! \n Resultado final abaixo:\n");
		printf("<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n\n Solution found! \n Final result below:\n");
		printarSudoku(sudoku);
		printf("<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n\n");
		didItWork=1;
	}
	else
	{
		didItWork=0;
		//printarSudoku(sudoku);
	}
	
	return didItWork;
}